package com.yuven.appframework.util.security

import android.text.TextUtils
import java.nio.charset.Charset
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.DESKeySpec

object DESHelper {
    private val CHARSET = charset("utf-8")
    private const val DES = "DES" // 非对称加密密钥算法
    private const val CIPHER_NAME = "DES/ECB/PKCS5Padding"

    /**
     * 加密函数
     *
     * @param data 加密数据
     * @param key  密钥
     * @return 返回加密后的数据
     */
    @JvmStatic
    fun encrypt(key: String, data: String?): String {
        if (TextUtils.isEmpty(data)) return ""
        // DES算法要求有一个可信任的随机数源
        val sr = SecureRandom()
        // 从原始密钥数据创建DESKeySpec对象
        val dks = DESKeySpec(key.toByteArray())
        // 创建一个密匙工厂，然后用它把DESKeySpec转换成
        // 一个SecretKey对象
        val keyFactory = SecretKeyFactory.getInstance(DES)
        val secretKey = keyFactory.generateSecret(dks)
        // using DES in ECB mode
        val cipher = Cipher.getInstance(CIPHER_NAME) //PKCS7Padding
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr)
        // 执行加密操作
        val encryptedData = cipher.doFinal(data!!.toByteArray(CHARSET))
        return Base64.encode(encryptedData)
    }

    /**
     * 解密函数
     *
     * @param data 解密数据
     * @param key  密钥
     * @return 返回解密后的数据
     */
    @JvmStatic
    fun decrypt(key: String, data: String?): String {
        if (TextUtils.isEmpty(data)) return ""
        // DES算法要求有一个可信任的随机数源
        val sr = SecureRandom()
        // 从原始密匙数据创建一个DESKeySpec对象
        val dks = DESKeySpec(key.toByteArray())
        // 创建一个密匙工厂，然后用它把DESKeySpec对象转换成
        // 一个SecretKey对象
        val keyFactory = SecretKeyFactory.getInstance(DES)
        val secretKey = keyFactory.generateSecret(dks)
        // using DES in ECB mode
        val cipher = Cipher.getInstance(CIPHER_NAME)
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, secretKey, sr)
        // 正式执行解密操作
        val encryptedData: ByteArray = Base64.decodeToBytes(data)
        val decryptedData = cipher.doFinal(encryptedData)
        return String(decryptedData, CHARSET)
    }
}